基于约瑟夫环,所写出的各种不同类型的代码。
基本思想:1、建立一个长度为n的数组或者链。
2、取出位置编号为(i+1)*m的数显示,将位置编号为(i+1)*m的数置0或者空(i=(i+m-1)%n i为编号,m为所要出去的数,n为总数)
3、第一轮取完之后的数再组成一个新的数组,用2的办法再取;
4、重复3的操作,最后剩下m-1个数字。
递归型:int fun(int i,int j, int k) //约瑟夫环
{
if (k == 1)
return (i+j-1)%m;
else
return (fun(i-1,j,k-1)%m);
}
int main()
{
int i;
for (i = 0;i < 10;i++)
{
printf("第%d次出环:%d\n",fun(10,3,i)
}
return 0;
}
数组型:#include <stdio.h>
#include <string.h>
#define N 100
int main()
{
int m;
int n;
printf("请输入总人数n \n");
scanf("%d",&n);
printf("请输入报的数m \n");
scanf("%d",&m);
int a[N] = {0};
int i;
int j;
int k = 0;
for(i = 0; i < n; i++)
{
a[i] = i+1;
}
while (n > 1)
{
i = (i + m - 1) % n; //i 为初始化时的号码,m为报的数如3
k++;
printf("第%d个出圈的是%d\n",k,a[i]);
for(j = i+1; j < n; j++)
{
a[j-1] = a[j];
}
n--;
if(i == n)
{
i = 0;
}
}
printf("最后剩下的时%d\n", a[i]);
return 0;
}
标记型:include<stdio.h>
#define MAX_VALUE 100
int main()
{
int a[MAX_VALUE] = { 0 };
int next = 0, cur = 0, flag = 0,change_flag=0;
while (1)
{
int count = 0;
if (flag != 0)
{
cur = next;
next++;
if (next >= MAX_VALUE)
{
next = 0;
}
}
else
{
cur = 0;
flag = 1;
}
while (1)
{
if (a[next] == 0)
{
count++;
if (count == 3)
{
a[next] = 1;
printf("change a[%d] value to 1.\n", next);
change_flag++;
if (change_flag == MAX_VALUE)
{
printf("final value is %d\n",next);
system("pause");
return 0;
}
break;
}
}
next++;
if (next == MAX_VALUE)
{
next = 0;
}
}
}
}